/*
 * StockTypeInfo.h
 *
 *  Created on: 2011-12-12
 *      Author: fasiondog
 */

#pragma once
#ifndef STOCKTYPEINFO_H_
#define STOCKTYPEINFO_H_

#include "DataType.h"

namespace hku {

#define STOCKTYPE_BLOCK 0  ///板块
#define STOCKTYPE_A     1  ///A股
#define STOCKTYPE_INDEX 2  ///指数
#define STOCKTYPE_B     3  ///B股
#define STOCKTYPE_FUND  4  ///基金
#define STOCKTYPE_ETF   5  ///ETF
#define STOCKTYPE_ND    6  ///国债
#define STOCKTYPE_BOND  7  ///债券
#define STOCKTYPE_GEM   8  ///创业板
#define STOCKTYPE_BTC   9  ///比特币

#define STOCKTYPE_TMP 999  ///用于临时Stock

/**
 * 证券类型信息
 * @ingroup StockManage
 */
class HKU_API StockTypeInfo {
public:
    /** 默认构造函数，返回Null<StockTypeInfo>() */
    StockTypeInfo();
    StockTypeInfo(uint32, const string&, price_t, price_t,
                  int, size_t, size_t);

    /** 获取证券类型 */
    uint32 type() const { return m_type; }

    /** 获取证券类型描述信息 */
    const string& description() const { return m_description; }

    /** 获取最小跳动量 */
    price_t tick() const { return m_tick; }

    /** 每tick价格 */
    price_t tickValue() const { return m_tickValue; }

    /** 每单位价格 = tickValue / tick */
    price_t unit() const { return m_unit;}

    /** 获取价格精度 */
    int precision() const { return m_precision; }

    /** 获取每笔最小交易数量 */
    size_t minTradeNumber() const { return m_minTradeNumber; }

    /** 获取每笔最大交易数量 */
    size_t maxTradeNumber() const { return m_maxTradeNumber; }

    /** 仅用于python的__str__ */
    string toString() const;

private:
    uint32 m_type;              //证券类型
    string m_description;       //描述信息
    price_t m_tick;             //最小跳动量
    price_t m_tickValue;        //每一个tick价格
    price_t m_unit;             //每最小变动量价格，即单位价格 = tickValue/tick
    int m_precision;            //价格精度
    size_t m_minTradeNumber;    //每笔最小交易量
    size_t m_maxTradeNumber;    //每笔最大交易量
};


/**
 * 输出证券类型信息，如：StockTypeInfo(type, description, tick, precision,
 * minTradeNumber, maxTradeNumber)
 * @ingroup StockManage
 */
HKU_API std::ostream & operator<<(std::ostream &, const StockTypeInfo&);


///////////////////////////////////////////////////////////////////////////////
//
// 关系比较函数
//
///////////////////////////////////////////////////////////////////////////////
bool operator==(const StockTypeInfo&, const StockTypeInfo&);
bool operator!=(const StockTypeInfo&, const StockTypeInfo&);

/** 相等比较 */
inline bool operator==(const StockTypeInfo& m1, const StockTypeInfo& m2) {
    return m1.type() == m2.type();
}

/** 不等比较 */
inline bool operator!=(const StockTypeInfo& m1, const StockTypeInfo& m2) {
    return m1.type() != m2.type();
}


} /* namespace hikyuu */
#endif /* STOCKTYPEINFO_H_ */
